关于 Kingname | 谢乾坤

精通数据抓取、爬虫。网易 - 字节 - 红杉中国。 微软 MVP。 出版了《Python爬虫开发 从入门到实战》。

RSS 地址: https://www.kingname.info/atom.xml

请复制 RSS 到你的阅读器,或快速订阅到 :

Kingname | 谢乾坤 RSS 预览

一日一技:效率翻倍,国产大模型App的正确应用

1970-01-01 08:00:00

利益不相关声明,今天介绍的所有工具,都跟我没有任何软文合作,也没有金钱往来。我在这篇文章里面对他们做介绍仅仅是因为他们对我确实非常有用。

最近几个月,国产大模型相继推出了自己的 App,这些 App 不仅可进行 AI 对话,还能提供各种智能工具。谈论AI对话功能的文章太多了,我就不赘述了。今天聊聊他们的其他功能。不可否认,国产大模型比国外的大模型差了不少,但我一向秉持重器轻用的观点,我不管这些App提供了多少功能,我只看它里面有没有功能适合我,即便它提供了100个功能,我可能只会使用它其中一个适合我的功能。

一日一技:如何强迫LLama3用中文回复?

1970-01-01 08:00:00

最近大家都在说LLama3如何如何强大,追赶Claude3,超过GPT 4。但如果大家真的使用过,就会发现它连基本的中文都回答不好。如下图所示:
LLama3总是尽可能回复英文,并且还会加很多表情符号。

一日一技:2秒抓取网页并转换为markdown

1970-01-01 08:00:00

在《一日一技:自动提取任意信息的通用爬虫》这篇文章中,我提到可以通过大模型从网页内容里面提取结构化信息。为了节省Token,文章里面我直接提取了页面上的所有文本。

一日一技:在macOS上查看任意软件的调试信息

1970-01-01 08:00:00

如果你使用macOS,想看上面某个软件使用什么技术开发的。那么你可以使用这个方法。它对普通人来说可能没什么用。如果你本来就做macOS软件开发,那么这个方法可能会很有用。

首先,我们知道macOS上面,安装的软件一般都放在/Applications/或者~/Applications文件夹里面。这里我以阿里网盘为例。

一日一技:setup.py里面的两个小技巧

1970-01-01 08:00:00

当你要自己发布一个Python包时,下面这两个小技巧可能对你有用。

pip安装后执行代码

今天公众号粉丝群里面,有同学提问:

这个同学自己开发了一个Python包,这个包在使用pip安装时,会产生一些临时文件。他希望安装完成以后,能够自动清理这些临时文件。

一日一技:怎么中文也属于字母?

1970-01-01 08:00:00

我最近在使用一个第三方库,叫做RapidFuzz。它有一个工具函数,叫做utils.default_process,在官方文档里面,是这样介绍的:


红色方框里面说,这个函数可以移除所有的非alphanumeric字符。如果我们使用翻译软件,会发现alphanumeric的意思是字母和数字。如下图所示:

因此,我想当然的觉得,这个功能函数,只会保留26个英文字母的大小写加上10个数字,一共62个字符。把除此之外的所有其他字符都移除掉。

一日一技:Python工具脚本如何调用外层模块

1970-01-01 08:00:00

我三年前写过一篇文章:《小问题大隐患:如何正确设置 Python 项目的入口文件?》。讲到Python项目应该如何正确组织代码结构。入口文件应该在最外面,调用关系应该是从外向内调用。而不要学Java,从一个很深层的文件夹里面往外调用。

不过我在这篇文章的最后,也提到了一种例外情况,那就是工具脚本不受这个规则的限制。如下图所示。

一日一技:三分钟离线运行开源大模型

1970-01-01 08:00:00

经过一年多的发展,各种开源大模型现在已经相当不错了。国产的Qwen 1.5的生成效果已经能满足一些日常使用。

有一些同学可能之前一直在用网页版的ChatGPT、Kimi Chat、文心一言或者通义千问,那么你可能会遇到如下一些问题:

  1. 网络问题。例如ChatGPT需要特殊的网络才能访问。
  2. 审查问题。国产大模型会大量屏蔽关键字,有一些你觉得完全没有任何问题的回答,它会告诉你不符合法律规范,不能回答。
  3. 不能自定义模型,网页版的这些大模型,你没有办法做微调,难以自定义内容。当你花了大量时间设计了一个高级Prompt,把模型洗脑成了猫娘,结果第二天它又不能用了。
  4. 隐私泄漏问题,担心大模型的开发商把你问的问题和上传的信息挪作他用。

当你被这些问题困扰,那么你可以考虑离线运行开源大模型。完全不需要网络,因此不存在隐私泄漏的问题。你可以随意对模型进行微调,想弄成猫娘还是伪娘都随你的想法。没有任何审查,想怎么问怎么答都可以调整。

一日一技:iOS下的开源免费消息推送服务

1970-01-01 08:00:00

我们在部署代码到线上以后,可能会需要在一些情况下给自己发报警通知。如果是公司的线上业务,一般会有公司内部的各种通知工具。

但如果是自己的个人服务,我们应该怎么推送消息呢?有些同学可能使用过叮叮或者飞书机器人,但是这些机器人要发送通知还需要拉个群,稍微有点麻烦。有些同学可能使用的是Telegram,但使用它需要梯子也不太方便。

如果你的手机是iPhone,那么你可以使用一个开源免费超级轻量级的消息推送服务:Bark.

一日一技:next.js如何正确处理跨域问题?

1970-01-01 08:00:00

我以前一直使用Vue来写前端。去年下半年接手了一个基于React + Next.js的项目,于是顺带学习了一下Next.js。由于Next.js的特点,这个项目的前后端是放在一起的。一开始没什么问题,看了半天文档就上手了。

上周我们需要在另一个网页项目中,调用这个项目的后端接口,于是就需要处理跨域请求的问题。但我发现按照网上的方法,跨域问题依然存在。这个问题浪费了我不少时间,好在最后终于找到了原因。记录在这里,免得大家跟我一样踩坑。

再见2023,你好2024

1970-01-01 08:00:00

跟风来写个年终总结。

我记得在2023年元旦,我发了个语音,说我要开始搞播客。结果1年过去了,播客还是没个影子。今年不设这个目标了,免得又拖到明年。

2023年开头的前5个月,是2022年痛苦的延续。我真的太讨厌字节了。每一天都过得非常痛苦。公众号没有时间写,自己的代码也没有时间写,连学习的时间都没有。每天下班就只想躺下。连躺下都躺不安稳,飞书上面的消息一直在轰炸,动不动就开语音。开你妈个锤子的语音。急急急,急你MLGB,你连一小时都活不下去了吗?我每天在心里骂字节和某些没有边界的同事一百遍。

一日一测:Bright Data的海外代理测试

1970-01-01 08:00:00

上周的公众号文章提到了Bright Data提供的代理服务。没想到他们的运营同学竟然找上了门,问我能不能帮他们做一个评测。

我之前使用Bright Data的代理,是因为突然有一天我的HuggingFace爬虫挂了。比较奇怪的是,这个爬虫在我电脑上始终正常运行,但一放到服务器上就请求失败。联想到HuggingFace被封了,而这个爬虫之前一直使用的国内代理供应商,那么原因就很明显了。因为我的电脑是24小时挂着梯子的,所以能够正常访问HuggineFace,但爬虫部署到服务器上面以后,他会自动使用配置好的国内代理。由于国内代理也受到GFW的影响,因此也会出问题。

一日一技:自动提取任意信息的通用爬虫

1970-01-01 08:00:00

使用过GNE的同学都知道,GNE虽然是通用爬虫,但只是文章类页面的通用爬虫。如果一个页面不是文章页,那么就无能为力了。

随着ChatGPT引领的大语言模型时代到来,这个问题基本上已经不是问题了。我们先来看一个效果。首先打开Linkedin,随便找一个招聘的岗位,如下图所示:

然后,我们直接使用GPT从这里提取信息:

GnePro:文章类通用爬虫接口

1970-01-01 08:00:00

GnePro是开源项目GNE的付费版,能够实现如下功能:

一日一技:分布式系统的低成本权限校验机制

1970-01-01 08:00:00

经常关注未闻Code的同学都知道,我做了一个叫做GNE的开源项目,它能够自动提取新闻类网页的正文。效果远远好于市面上其他的开源新闻提取工具。

大家可能不知道,GNE还有一个高级版,叫做GnePro。它可以让你输入URL就自动提取新闻的正文,提取的字段比GNE多得多。并且已经在8个国家13万个网站上做过测试,识别准确率100%。

一日一技:如何同时在多个分支写代码?

1970-01-01 08:00:00

当我们在维护公司项目时,可能会遇到这样的场景:我正在开发一个新功能,突然需要修一个Bug。

这个时候,有些同学是这样做的:

1
2
3
4
5
6
7
8
git add .
git commit -m 'WIP'
git checkout -b 新的分支名

...新的代码修改完成并push以后...

git checkout 老分支
...继续开发...

更有一些经验的同学,可能会这样写:

1
2
3
4
5
git stash
git checkout -b 新的分支
...新的代码修改完成并push以后...
git checkout 老分支
git stash pop

但如果在修这个Bug的时候,又来了一个更紧急的Bug需要修怎么办?到后面很容易就把前面的代码搞忘了。

一日一技:警告但不禁止,遗留代码的优化策略

1970-01-01 08:00:00

在之前的多篇文章中,我都反复告诫大家,不要滥用字典来传大量数据。因为当你的函数收到一个字典的时候,你根本不知道这个字典里面有哪些Key,你必须有一层一层往上看,找到所有尝试往字典里面添加新Key的地方,你才能知道它总共有哪些Key。

但是,在正常公司项目中,我们可能会需要维护一些历史遗留代码。代码规模大,函数调用层级非常深。并且之前的人已经使用字典来传递了大量的数据。

短时间内,我们没有办法直接把字典改成Dataclass。那么我们能做的,就是尽量避免后续的维护者往里面加入新的Key。我以前遇到过一个项目,它有一个字典,刚刚开始初始化的时候,只有5个Key。这个字典作为参数被传入了很多个函数,每个函数都会往它里面加很多个Key。到最后,这个字典里面已经有40多个Key了。

老板让我加班怎么办?GPTs创建机器人实战

1970-01-01 08:00:00

前两天的OpenAI发布会,相信很多同学看完以后都热血沸腾。我之前一直使用的是ChatGPT的免费版本,看完这个发布会以后,立刻就充值了ChatGPT Plus,来试一试这些高级功能。

这两天GPTs功能上线了,短短三天时间,全球网友创建了几千个GPT机器人。我今天也来搞一个玩玩。

使用GPTs创建机器人非常简单,不需要懂任何编程知识,甚至不需要懂Prompt工程,你只需要跟着他的向导,一步一步描述你的想法就可以了。

一日一技:如何安全运行别人上传的Python代码?

1970-01-01 08:00:00

写后端的同学,有时候需要在网站上实现一个功能,让用户上传或者编写自己的Python代码。后端再运行这些代码。

涉及到用户自己上传代码,我们第一个想到的问题,就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两行,在不做任何安全过滤的情况下,就会导致服务器的Home文件夹被清空。

1
2
import os
os.system('rm -rf ~/*')

有人想的比较简单,直接判断用户的代码里面有没有os.systemexecsubprocess……这些危险关键词不就可以了吗?

这种想法乍看起来没有问题,但细想下,就会发现非常天真。如果用户的代码像下面这样写,你又要如何应对?

一日一技:爬虫如何解析JavaScript Object?

1970-01-01 08:00:00

我们在开发爬虫的过程中,经常发现有一些网站,会直接把数据放到HTML中的<script>标签里面。这些数据长得有点像JSON,但又有差异,如下图所示:

这种格式,我们叫做JavaScript Object。长得很像Python的字典,又很像是JSON。但是这个格式在Python里面,无论直接当字典解析,还是当JSON解析,都会报错,如下图所示:

遇到这种情况,有同学准备使用正则表达式来解析,又有同学直接放弃。